/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../macro/head.h"
#include "aio_impl.h"
#include "mgr.h"
#include "hook.h"

////////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos_aio
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_container::i_container * container_ptr = 0;
    static mgr * aio_mgr_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    mgr::mgr() : m_pNotify( 0 )
    {
    }

    mgr::~mgr()
    {
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////

    int mgr::static_init( xos_container::i_container * pContainer, i_aio_mgr ** ppv )
    {
        int ret = 0;

        mgr::T * pObj = 0;

        if( ( 0 == ret ) && !ppv )
        {
            ret = 1;
        }

        if( 0 == ret )
        {
            container_ptr = pContainer;
        }

        if( 0 == ret )
        {
            pObj = new mgr::T;
            if( !pObj )
            {
                ret = 1;
            }
        }

        if( 0 == ret )
        {
            ret = pObj->init();
        }

        if( 0 == ret )
        {
            aio_mgr_ptr = pObj;
            *ppv = pObj;
            pObj = 0;
        }

        if( pObj )
        {
            xos_stl::release_interface( pObj );
        }

        return ret;
    }

    xos_container::i_container * mgr::container()
    {
        return container_ptr;
    }

    mgr * mgr::get()
    {
        return aio_mgr_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////

    // 
    // 设置最大投递的accept,recv,send数量。
    // 0表示默认
    // 只在windows下有效，其它平台下无用
    // 
    int mgr::set_tcp_max_post_num( int nMaxPostAcceptNum, int nMaxPostRecvNum, int nMaxPostSendNum )
    {
        int ret = 0;
        return ret;
    }

    int mgr::set_udp_max_post_num( int nMaxPostRecvNum, int nMaxPostSendNum )
    {
        int ret = 0;
        return ret;
    }

    // 
    // set callback thread. all aios use ONE callback thread.
    // 
    int mgr::set_callback_thread( xos_box::i_callback * pCallbackThread )
    {
        int ret = 0;
        m_pNotify->set_thread( pCallbackThread );
        return ret;
    }

    int mgr::set_msg_type( int nMsgType )
    {
        int ret = 0;
        m_pNotify->set_msg_type( nMsgType );
        return ret;
    }

    // 
    // create aio
    // 
    i_aio * mgr::aio()
    {
        aio_impl::T * pRet = 0;
        xos_stl::init_pool_item( pRet );
        return pRet;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    xos_box::i_notify * mgr::notify() const
    {
        return m_pNotify;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::put_back_to_pool()
    {
        int ret = 0;
        delete this;
        return ret;
    }

    int mgr::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            hook::init();
        }

        if( 0 == ret )
        {
            ret = mgr::container()->box()->engine()->create_notify( &m_pNotify );
        }

        return ret;
    }

    int mgr::term()
    {
        int ret = 0;
        xos_stl::release_interface( m_pNotify );
        hook::term();
        return ret;
    }

} // xos_aio
